package br.com.foxinline.manager.editar;

import br.com.foxinline.enums.Status;
import br.com.foxinline.enums.TipoAverbacao;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.enums.TipoQualidade;
import br.com.foxinline.enums.TipoRequerimento;
import br.com.foxinline.modelo.Averbacao;
import br.com.foxinline.modelo.CaixaRequerimento;
import br.com.foxinline.modelo.Forus;
import br.com.foxinline.modelo.Imovel;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.modelo.Requerimento;
import br.com.foxinline.modelo.RevisaoAlinhamento;
import br.com.foxinline.modelo.TramiteRequerimento;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.AverbacaoServico;
import br.com.foxinline.servico.CaixaRequerimentoServico;
import br.com.foxinline.servico.ForusServico;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.ProprietarioServico;
import br.com.foxinline.servico.RequerimentoServico;
import br.com.foxinline.servico.RevisaoAlinhamentoServico;
import br.com.foxinline.servico.TramiteRequerimentoServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Msg;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author elyjunior
 */
@ManagedBean
@ViewScoped
public class ManagerEditarRequerimento {

    @EJB
    RequerimentoServico requerimentoServico;
    @EJB
    TramiteRequerimentoServico tramiteRequerimentoServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    CaixaRequerimentoServico caixaRequerimentoServico;
    @EJB
    AverbacaoServico averbacaoServico;
    @EJB
    ProprietarioServico proprietarioServico;
    @EJB
    ImovelServico imovelServico;
    @EJB
    RevisaoAlinhamentoServico revisaoAlinhamentoServico;
    @EJB
    ForusServico forusServico;
    Requerimento requerimento;
    Requerimento editTramite;
    Requerimento visualizarRequerimento;
    private CaixaRequerimento caixaRequerimento;
    String eReq;
    String eTramite;
    String vReq;
    boolean status;
    private TramiteRequerimento tramite;
    private List<TramiteRequerimento> tramites;
    private Usuario usuario;

    @PostConstruct
    public void init() {
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eReq = params.get("eReq");
        eTramite = params.get("eTramite");
        vReq = params.get("vReq");

        paramPost();
        tramite = new TramiteRequerimento();

        usuario = usuarioServico.getCurrentUser();
        caixaRequerimento = new CaixaRequerimento();

    }

    public List<SelectItem> tipoRequerimentoList() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoRequerimento tipo : TipoRequerimento.values()) {
            items.add(new SelectItem(tipo, tipo.getName()));
        }
        return items;
    }

    public List<SelectItem> tipoStatus() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (Status tipo : Status.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public void paramPost() {
        if (eReq != null) {
            requerimento = requerimentoServico.find(Long.parseLong(eReq));
        }
        if (eTramite != null) {
            editTramite = requerimentoServico.find(Long.parseLong(eTramite));
            tramites = tramiteRequerimentoServico.lstTramiteRequerimento(editTramite);
            if (editTramite.getCaixaRequerimento() == null) {
                editTramite.setCaixaRequerimento(new CaixaRequerimento());
            }
            if (editTramite.getStatus() == Status.PROTOCOLO) {
                if (editTramite.getProcesso() != null && !editTramite.getProcesso().equals("")) {
                    editTramite.setStatus(Status.ENTRADA);
                    if (editTramite.getTipoRequerimento().equals(TipoRequerimento.AVERBACAO)) {
                        if (editTramite.getCaixaRequerimento() != null) {
                            editTramite.getCaixaRequerimento().setValor(new BigDecimal(25));
                        } else {
                            requerimento.setCaixaRequerimento(new CaixaRequerimento());
                            requerimento.getCaixaRequerimento().setValor(new BigDecimal(25));
                        }
                    }
                    if (editTramite.getTipoRequerimento().equals(TipoRequerimento.REVISAO_ALINHAMENTO)) {
                        RevisaoAlinhamento rev = revisaoAlinhamentoServico.getRevisaoAlinhamentoRequerimento(editTramite);
                        BigDecimal vml = new BigDecimal(1.90);
                        BigDecimal t = new BigDecimal(1.90);
                        BigDecimal m = rev.getFrente();
                        BigDecimal result = (m.multiply(vml).add(t));
                        editTramite.getCaixaRequerimento().setValor(result);
                    }
                }
            }
        }

        if (vReq != null) {
            visualizarRequerimento = requerimentoServico.find(Long.parseLong(vReq));
            tramites = tramiteRequerimentoServico.lstTramiteRequerimento(visualizarRequerimento);
        }
    }
    public TramiteRequerimento getTramite() {
        TramiteRequerimento t = new TramiteRequerimento();
        t.setDataTramite(new Date());
        t.setStatus(editTramite.getStatus());
        t.setUsuario(usuario);
        return t;
    }
    public void atualizar() {

        try {
            requerimento.setCpfInteressado(Caracter.removecaracter(requerimento.getCpfInteressado()));
            requerimento.setCnpjInteressado(Caracter.removecaracter(requerimento.getCnpjInteressado()));
            requerimento.setCpfProprietario(Caracter.removecaracter(requerimento.getCpfProprietario()));
            requerimento.setCnpjProprietario(Caracter.removecaracter(requerimento.getCnpjProprietario()));

            requerimentoServico.update(requerimento);
            Msg.messagemInfo("Atualizado com Sucesso");
        } catch (Exception erro) {
            System.out.println(erro);
        }
    }
    public void atualizarTramite() {
        try {
            if (editTramite.getStatus() == Status.ENTRADA) {
                editTramite.getCaixaRequerimento().setTipoRequerimento(editTramite.getTipoRequerimento());
                editTramite.getCaixaRequerimento().setTipoRequerimento(editTramite.getTipoRequerimento());
                editTramite.getCaixaRequerimento().setDataEntrada(new Date());
                editTramite.getCaixaRequerimento().setTipoAverbacao(editTramite.getTipoAverbacao());
                caixaRequerimento.setValor(editTramite.getCaixaRequerimento().getValor());
                caixaRequerimentoServico.update(editTramite.getCaixaRequerimento());
            }
            if (editTramite.getStatus().equals(Status.ENTRADA) && editTramite.getCaixaRequerimento() != null && editTramite.getCaixaRequerimento().getValor() != null) {
                Msg.messagemInfo("Tramite Atualizado com Sucesso");
                org.primefaces.context.RequestContext.getCurrentInstance().execute("dlg.show()");
            } else {
                Msg.messagemInfoRedirect("Tramite Atualizado com Sucesso", "pesquisarrequerimento.xhtml");
            }
            if (editTramite.getTipoRequerimento() == TipoRequerimento.AVERBACAO) {
                if (editTramite.getStatus() == Status.FINALIZAR) {
                    if (editTramite != null) {
                        Averbacao aver = averbacaoServico.getAverbacaoRequerimento(editTramite);
                        if (aver.getTipoAverbacao() == TipoAverbacao.TRANSFERENCIA) {                           
                            averbacaoTransferencia(aver);
                            aver.setFinalizado(true);
                            averbacaoServico.update(aver);
                            gerarForus(aver);
                        }
                        if (aver.getTipoAverbacao() == TipoAverbacao.MUDANCA_NOME) {
                            averbacaoMudancaNome(aver);
                            aver.setFinalizado(true);
                            averbacaoServico.update(aver);
                            gerarForus(aver);
                        }
                        if (aver.getTipoAverbacao() == TipoAverbacao.DESMEMBRAMENTO) {
//                            List<Imovel> imoveisAverbacao = averbacaoServico.getPorImovelAverbacao(aver);
//                            aver.getImovel().setAtivo(false);
//                            imovelServico.update(aver.getImovel());
//                            for (Imovel im : imoveisAverbacao) {
//                                im.setAtivo(true);
//                                imovelServico.update(im);
//                            }
                            averbacaoDesmembramento(aver);
                            aver.setFinalizado(true);
                            averbacaoServico.update(aver);
                        }
                    }
                }
            }
            if (editTramite.getTipoRequerimento() == TipoRequerimento.REVISAO_ALINHAMENTO) {
                if (editTramite.getStatus() == Status.FINALIZAR) {
                    RevisaoAlinhamento rev = revisaoAlinhamentoServico.getRevisaoAlinhamentoRequerimento(editTramite);
                    if (rev != null) {
                        rev.getImovel().setFrenteMedindo(rev.getFrente());
                        rev.getImovel().setFundoMedindo(rev.getFundo());
                        rev.getImovel().setLadoDireitoMedindo(rev.getLadoDireito());
                        rev.getImovel().setLadoEsquerdoMedindo(rev.getLadoEsquerdo());
                        imovelServico.update(rev.getImovel());
                    }
                    rev.setFinalizado(Boolean.TRUE);
                    revisaoAlinhamentoServico.update(rev);
                }
            }

            // Requerimento

            if (editTramite.getId() != null) {
                tramite = getTramite();
                tramites.add(tramite);
                tramiteRequerimentoServico.save(tramite);
                editTramite.setTramites(tramites);
            }
            if (editTramite.getId() == 0) {
                requerimentoServico.save(editTramite);
            } else {
                requerimentoServico.update(editTramite);
            }

        } catch (Exception erro) {
            System.out.println(erro);
        }
    }

    public void averbacaoTransferencia(Averbacao averbacao) {
        if (averbacao != null) {
            averbacao.getImovel().setProprietarios(averbacao.getAdquirente());
            for (Proprietario pro : averbacao.getAdquirente()) {
                if (pro.getId() == null) {
                    proprietarioServico.save(pro);
                }
            }
            imovelServico.update(averbacao.getImovel());
        }
    }

    public void averbacaoMudancaNome(Averbacao averbacao) {
        List<Proprietario> proprietarios = averbacao.getImovel().getProprietarios();
        for (Proprietario p : proprietarios) {
            if (p.getNome().equals(averbacao.getNomeAnterior()) && p.getCpf().equals(averbacao.getCpfNomeAnterior())) {
                p.setNome(averbacao.getNomeAtual());
                proprietarioServico.update(p);
            }
        }
    }

    public void averbacaoDesmembramento(Averbacao averbacao) {
        List<Imovel> imoveisAverbacao = averbacaoServico.getPorImovelAverbacao(averbacao);
        averbacao.getImovel().setAtivo(false);
        imovelServico.update(averbacao.getImovel());
        for (Imovel im : imoveisAverbacao) {
            im.setAtivo(true);
            imovelServico.update(im);
        }
    }

    public void gerarForus(Averbacao averbacao) {
        Double indice = 0.020;
        Double areaTotal = averbacao.getImovel().getDimensoes().getAreaTerreno().doubleValue();
        Double total = areaTotal*indice;
        
        List<Averbacao> averbacoes = averbacaoServico.getPorImovel(averbacao.getImovel());
        Forus forus = null;
        for (Averbacao avv : averbacoes) {
            forus = forusServico.possuiForus(avv);
        }
        if (forus != null) {

            forus.setValor(new BigDecimal(total));
            forusServico.update(forus);
        } else {
            Forus forusSave = new Forus();
            forusSave.setAverbacao(averbacao);
            forusSave.setValor(new BigDecimal(total));
            forusSave.setDataForus(new Date());
            forusSave.setPago(Boolean.FALSE);
            forusServico.save(forusSave);
        }
    }

    public void redirectVisualizarRequerimento() throws IOException {
        Msg.messagemInfoRedirect("Operação Realizado com Sucesso", "visualizarrequerimento.xhtml?vReq=" + editTramite.getId());
    }

    public void redirectRequerimento(Requerimento req) throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect("visualizarrequerimento.xhtml?vReq=" + req.getId());
    }

    public Requerimento getRequerimento() {
        return requerimento;
    }

    public void setRequerimento(Requerimento requerimento) {
        this.requerimento = requerimento;
    }

    public Requerimento getEditTramite() {
        return editTramite;
    }

    public void setEditTramite(Requerimento editTramite) {
        this.editTramite = editTramite;
    }

    public Requerimento getVisualizarRequerimento() {
        return visualizarRequerimento;
    }

    public void setVisualizarRequerimento(Requerimento visualizarRequerimento) {
        this.visualizarRequerimento = visualizarRequerimento;
    }

    public List<TramiteRequerimento> getTramites() {
        return tramites;
    }

    public void setTramites(List<TramiteRequerimento> tramites) {
        this.tramites = tramites;
    }

    public CaixaRequerimento getCaixaRequerimento() {
        return caixaRequerimento;
    }

    public void setCaixaRequerimento(CaixaRequerimento caixaRequerimento) {
        this.caixaRequerimento = caixaRequerimento;
    }

    public boolean getExibir() {
        if (visualizarRequerimento.getStatus() == null || !visualizarRequerimento.getStatus().equals(Status.ENTRADA)) {
            return false;
        }
        if (visualizarRequerimento.getCaixaRequerimento() == null || !visualizarRequerimento.getCaixaRequerimento().getTipoRequerimento().equals(TipoRequerimento.AVERBACAO)) {
            return false;
        }
        if (visualizarRequerimento.getCaixaRequerimento().getValor() == null) {
            return false;
        }
        return true;
    }

    public void imprimir(Requerimento requerimento) throws IOException {
        requerimentoServico.imprimirBoleto(requerimento);
    }

    public void imprimir() throws IOException {
        requerimentoServico.imprimirBoleto(visualizarRequerimento);
    }
}
